Reproduzierbare Forschung
mit R und Quarto – Praktischer Teil

Workshop für die GSE Wuppertal

Björn S. Siepe

June 27, 2025

Quarto/Markdown Grundlagen

YAML Header

  • Enthält Metadaten für das Dokument
  • Beispiel:

Text

Basierend auf markdown:

## Formatierung
*italic* **bold** ~~strikeout~~ `code`
superscript^2^ subscript~2~
[underline]{.underline} [small caps]{.smallcaps}

## Überschriften
# Erste Ebene
## Zweite Ebene
### Dritte Ebene

## Listen
-   Punkt 1 einer Liste
-   Punkt 2
    -   Punkt 2a
    -   Punkt 2b

1.  Nummerierte Liste Punkt 1
2.  Punkt 2.
    Die Zahlen der Liste werden automatisch angepasst.
    
## Quotes
> Gutes Zitat hier.

Code Chunks - Basics

Quarto Input

```{r}
mean(c(1, 2, 3, 4, 5))
```
```{r}
#| label: my-plot
#| echo: false
plot(cars)
```
```{python}
import pandas as pd
df = pd.DataFrame({'x': [1, 2, 3]})
print(df)
```

Rendered Output

[1] 3

Plot (with echo: false):

Python output:

   x
0  1
1  2
2  3

Code Chunks: Anpassung

  • Code Chunks können mit verschiedenen Optionen angepasst werden
    • Namen
    • Ausführung
    • Abbildungsoptionen
```{r}
#| label: Beispielchunk
#| echo: true 
#| fig-width: 6
```

Code Chunks: Optionen

Verschiedene Optionen können in den Code Chunks verwendet werden:

Wickham, Çetinkaya-Rundel, and Grolemund (2023)

Inline Code

  • Inline Code wird mit r oder python in Backticks geschrieben:
Der Mittelwert der ganzen Zahlen von 1 bis 5 ist "3".

Ergibt:

Der Mittelwert der ganzen Zahlen von 1 bis 5 ist 3.

Visual Editor

  • Quarto bietet einen Visual Editor, der die Bearbeitung von Markdown-Dateien erleichtert
  • Er kann über das Menü “View” → “Visual Editor” aktiviert werden
  • Er ermöglicht eine WYSIWYG-Erfahrung

Übung 1

Zeit zum Üben!

  • Laden Sie entweder aufgabe_01.qmd herunter oder erstellen Sie eine neue Quarto-Datei.
  • Personalisieren Sie den YAML-Header.
  • Laden Sie den “USArrests” Datensatz in R. Dies geht mit data("USArrests").
  • Schreiben Sie einen kurzen Einleitungstext für eine Beispielanalyse. Verwenden Sie unterschiedliche Formatierungen.
  • Berichten Sie über das Minimum und Maximum einer der Variablen in einem Satz.

Abbildungen

  • Beispiel:
Code
data("USArrests")
library(ggplot2)
ggplot(USArrests, aes(x = UrbanPop, y = Murder, color = Assault)) +
  geom_point(size = 3, alpha = 0.8) +
  scale_color_gradient(low = "#56B1F7", high = "#132B43") +
  labs(
    title = "Zusammenhang zwischen Urbanisierung und Mordrate",
    subtitle = "USArrests Datensatz (1973)",
    x = "Anteil Stadtbevölkerung (%)",
    y = "Mordrate pro 100.000 Einwohner",
    color = "Anzahl\nAssault"
  ) +
  theme_minimal(base_size = 14)

Mehrere Abbildungen

  • Wir können auch mehrere Abbildungen zusammen einfügen:

Externe Grafiken

  • Externe Bilder können mit Markdown-Syntax oder knitr::include_graphics() eingefügt werden:

Markdown-Syntax:

![Bildbeschreibung](pfad/zum/bild.png){width=50%}

R Code Chunk:

knitr::include_graphics("images/my_plot.png")

Online-Bilder:

![R Logo](https://www.r-project.org/logo/Rlogo.png){width=200px}

Tabellen: In Quarto

  • Tabellen können in Quarto mit Markdown-Syntax erstellt werden.
  • Beispiel:
Bundesstaat Mordrate UrbanPop Assault
Alabama 13.2 58.0 236.0
Alaska 10.0 48.0 263.0
————- ———- ———- ———

Tabellen: In R

  • Tabellen können mit vielen Paketen erstellt werden, z.B. kable, gt, flextable oder pander.
  • Beispiel mit kable:
data("USArrests")
library(knitr)
kable(head(USArrests), caption = "Erste 6 Zeilen des USArrests Datensatzes") 
Erste 6 Zeilen des USArrests Datensatzes
Murder Assault UrbanPop Rape
Alabama 13.2 236 58 21.2
Alaska 10.0 263 48 44.5
Arizona 8.1 294 80 31.0
Arkansas 8.8 190 50 19.5
California 9.0 276 91 40.6
Colorado 7.9 204 78 38.7

Tabellen: Formatierung

  • Tabellen können mit verschiedenen Paketen formatiert werden
  • Dabei können sehr schöne und anpassbare Tabellen erstellt werden, die auch Visualisierungen enthalten können
  • Simples Beispiel mit gt und gtExtras:

::: fragment

USArrests
50 rows x 4 cols
Column Plot Overview Missing Mean Median SD
Murder 800 mauto17 auto 0.0% 7.8 7.2 4.4
Assault 45 auto337 auto 0.0% 170.8 159.0 83.3
UrbanPop 32 auto91 auto 0.0% 65.5 66.0 14.5
Rape 7 auto46 auto 0.0% 21.2 20.1 9.4

Tabellen-Export für Manuskripte

  • Tabellen können in verschiedenen Formaten exportiert werden, z.B. LaTeX, HTML oder Word.
  • Beispiel mit flextable für eine APA-konforme Tabelle:
library(flextable)
tabelle <- flextable(head(USArrests))

tabelle |>
  save_as_docx("USArrests_table.docx", path = here::here("tables"))

Übung 2

  • Verwenden Sie entweder Ihr existierendes Quarto-Dokument oder laden Sie aufgabe_02.qmd herunter.
  • Fügen Sie eine Abbildung hinzu, die den Zusammenhang zwischen “UrbanPop” und “Assault” im USArrests Datensatz zeigt.
    • Ändern Sie die Größe der Abbildung.
    • Optional: Speichern Sie die Abbildung und laden Sie als externes Bild ein.
  • Fügen Sie eine Tabelle hinzu.
  • Versuchen Sie, die Tabelle schöner zu formatieren.

Referenzen

  • Referenzen können mit BibTeX-Dateien eingebunden werden.
  • Als Beispiel verwenden wir referenzen.bib. Dies müssen wir im YAML-Header angeben:
bibliography: referenzen.bib
csl: apa.csl  # Optional: Style
  • Ein Zitat kann dann so aussehen:
    • [@wickham2016] → (Wickham, 2016)
    • @wickham2016 → Wickham (2016)
    • [@wickham2016; @r2023] → (Wickham, 2016; R Core Team, 2023)

BibTeX Beispiel

Eine typische referenzen.bib Datei sieht so aus:

@book{wickham2016,
  title = {R for Data Science},
  author = {Hadley Wickham and Garrett Grolemund},
  year = {2016},
  publisher = {O'Reilly Media},
  isbn = {978-1491910399}
}

@manual{r2023,
  title = {R: A Language and Environment for Statistical Computing},
  author = {{R Core Team}},
  organization = {R Foundation for Statistical Computing},
  address = {Vienna, Austria},
  year = {2023},
  url = {https://www.R-project.org/}
}

Verschiedene Zitierweisen

Syntax Ausgabe Verwendung
[@autor2023] (Autor, 2023) Normale Klammerzitate
@autor2023 Autor (2023) Autor als Teil des Satzes
[@autor2023, S. 15] (Autor, 2023, S. 15) Mit Seitenzahl
[-@autor2023] (2023) Nur Jahr, ohne Autor
[@autor2023; @autor2024] (Autor, 2023, 2024) Mehrere Quellen

Referenzen hinzufügen

Manuell in der BibTeX-Datei: - Direkt in referenzen.bib editieren - Google Scholar: “Zitieren” → “BibTeX” kopieren (und DOI hinzufügen)

Zotero Integration: - Better BibTeX Plugin installieren - Auto-Export zu .bib Datei - Sync zwischen Zotero und Quarto

RStudio Visual Editor: - InsertCitation - Automatisches Hinzufügen zur .bib Datei

Literaturverzeichnis

  • Wird automatisch am Ende des Dokuments eingefügt
  • Nur zitierte Quellen werden angezeigt
  • Anpassung der Position:
# Literatur
::: {#refs}
:::

# Anhang
Weiterer Inhalt nach dem Literaturverzeichnis...

Rechenintensive Chunks

  • Teilweise möchten wir Code nicht ausführen, wenn das Dokument gerendert wird
    • z.B. bei rechenintensiven Operationen
    • Ausführung des Codes auf einem Server
    • oder bei Zufallsimulationen
    • oder wenn wir nur den Code zeigen wollen
  • Beispiel für die Übung gleich:
data("USArrests")

# Bootstrap durchführen, um Konfidenzintervall einer Regression zu schätzen
n_boot <- 1000
bootstrap_results <- numeric(n_boot)

# Bootstrap durchführen und Zeit messen
system.time({
  for(i in 1:n_boot) {
    # Zufälliges Sampling mit Zurücklegen
    boot_sample <- sample(nrow(USArrests), replace = TRUE)
    boot_data <- USArrests[boot_sample, ]
    
    
    boot_model <- lm(Murder ~ UrbanPop, data = boot_data)
    # Extrahieren der Slope
    bootstrap_results[i] <- coef(boot_model)[2]  
  }
})

# Konfidenzintervall berechnen
ci_lower <- quantile(bootstrap_results, 0.025)
ci_upper <- quantile(bootstrap_results, 0.975) 

Übung 3

  • Arbeiten sie entweder in Ihrer existierenden Quarto- Datei weiter oder verwenden Sie aufgabe_03.qmd.
  • Fügen Sie eine Referenz zu einem Buch oder Artikel hinzu, den Sie interessant finden.
  • Lassen Sie das Literaturverzeichnis am Ende des Dokuments erscheinen.
  • Führen Sie eine Regression auf den USArrests Datensatz durch und speichern Sie das Ergebnis. Sorgen Sie dafür, dass der Code nicht ausgeführt wird, wenn das Dokument gerendert wird.
  • Optional: Versuchen Sie, das Dokument so zu formatieren, dass es möglichst nah an einen echten Artikel herankommt.

Zusätzliche Vorteile von Quarto - Code-Highlighting

Quarto Input

::: {.cell}
::: {.cell-output-display}
![](02_praxis_files/figure-revealjs/unnamed-chunk-10-1.png){width=960}
:::
:::

Rendered Output

library(ggplot2)
data(mtcars)
# Create visualization
ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() + theme_minimal()

Zusätzliche Vorteile von Quarto - Tabsets

::: {.panel-tabset}

### Code

Hier könnten Sie R Code einfügen, der eine Abbildung erstellt.

### Figure

ggplot Code hier einfügen

:::

Zusätzliche Vorteile von Quarto - Tabsets

Hier kann man den R Code einfügen:

```{r}
library(ggplot2)
data(USArrests)
ggplot(USArrests, aes(x = UrbanPop, y = Assault)) +
  geom_point(color = "#56B1F7", size = 2) +
  labs(
    title = "Zusammenhang zwischen Urbanisierung und Assault-Rate",
    x = "Anteil Stadtbevölkerung (%)",
    y = "Assault pro 100.000 Einwohner"
  ) +
  theme_minimal()
```

Zusätzliche Vorteile von Quarto - Cross-References

Quarto Input

Siehe @fig-scatter für den Zusammenhang 
zwischen städtischer Bevölkerung und 
Mordrate.

```{r}
#| label: fig-scatter
#| fig-cap: "Städtische Bevölkerung vs Mordrate"
data("USArrests")
plot(USArrests$UrbanPop, USArrests$Murder)
```

Wie in @tbl-summary gezeigt, beträgt 
die mittlere Mordrate 7.8.

```{r}
#| label: tbl-summary
#| tbl-cap: "Zusammenfassende Statistiken"
kable(summary(USArrests$Murder))
```

Die Analyse in @sec-methods 
erklärt unser Vorgehen. 

## Methoden {#sec-methods}
:::

Cross-Reference Features

Vorteile:

  • Automatisch aktualisiert bei Änderungen
  • Klickbare Links in HTML/PDF
  • Konsistente Formatierung
  • Keine manuellen Nummern erforderlich

Zusätzliche Vorteile von Quarto - Conditional Content

Format-spezifischer Content

::: {.content-visible when-format="html"}
Dies ist nur im HTML-Format sichtbar.
[Interaktives Widget hier]
:::

::: {.content-visible when-format="pdf"}  
Dies ist nur im PDF-Format sichtbar.
Statische Darstellung hier.
:::

::: {.content-hidden when-format="revealjs"}
Dies ist nicht im Reveal.js Format sichtbar.
:::

Profile-basierter Content

::: {.content-visible when-profile="advanced"}
Fortgeschrittene Details hier.
:::

::: {.content-visible when-profile="beginner"}  
Einfache  Einführung hier.
:::

Rendering:

# Mit Profil rendern
quarto render --profile advanced
quarto render --profile beginner

Session Info

R version 4.5.0 (2025-04-11 ucrt)

Platform: x86_64-w64-mingw32/x64

locale: LC_COLLATE=German_Germany.utf8, LC_CTYPE=German_Germany.utf8, LC_MONETARY=German_Germany.utf8, LC_NUMERIC=C and LC_TIME=German_Germany.utf8

attached base packages: stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: gtExtras(v.0.6.0), gt(v.1.0.0), knitr(v.1.50) and ggplot2(v.3.5.2.9001)

loaded via a namespace (and not attached): Matrix(v.1.7-3), gtable(v.0.3.6), jsonlite(v.2.0.0), rematch2(v.2.1.2), dplyr(v.1.1.4), compiler(v.4.5.0), Rcpp(v.1.0.14), tidyselect(v.1.2.1), xml2(v.1.3.8), dichromat(v.2.0-0.1), tidyr(v.1.3.1), textshaping(v.1.0.0), systemfonts(v.1.2.2), splines(v.4.5.0), scales(v.1.4.0), yaml(v.2.3.10), fastmap(v.1.2.0), lattice(v.0.22-7), paletteer(v.1.6.0), R6(v.2.6.1), labeling(v.0.4.3), generics(v.0.1.3), tibble(v.3.2.1), pander(v.0.6.6), svglite(v.2.1.3), pillar(v.1.10.2), RColorBrewer(v.1.1-3), rlang(v.1.1.6), xfun(v.0.52), sass(v.0.4.10), S7(v.0.2.0), cli(v.3.6.5), withr(v.3.0.2), magrittr(v.2.0.3), mgcv(v.1.9-3), digest(v.0.6.37), grid(v.4.5.0), fontawesome(v.0.5.3), lifecycle(v.1.0.4), nlme(v.3.1-168), vctrs(v.0.6.5), evaluate(v.1.0.3), glue(v.1.8.0), farver(v.2.1.2), ragg(v.1.4.0), purrr(v.1.0.4), rmarkdown(v.2.29), tools(v.4.5.0), pkgconfig(v.2.0.3) and htmltools(v.0.5.8.1)

Literatur

Wickham, H., M. Çetinkaya-Rundel, and G. Grolemund. 2023. R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. O’Reilly Media.